package com.xhwy.service.impl;

import com.xhwy.entity.User;
import com.xhwy.entity.UserType;
import com.xhwy.param.UserLoginParam;
import com.xhwy.param.UserParam;
import com.xhwy.mapper.UserMapper;
import com.xhwy.param.UserCheckParam;
import com.xhwy.param.UserUpdateParam;
import com.xhwy.service.UserService;
import com.xhwy.util.MD5Util;
import com.xhwy.util.PageUtil;
import com.xhwy.util.R;
import com.xhwy.enums.UserState;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

//业务层
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 登录业务
     * 1. 密码的加密和加盐处理
     * 2. 账号和密码进行数据库查询，返回一个完整的数据库user对象
     * 3. 判断返回结果
     * @param userLoginParam 账号和密码，但是密码是明文
     * @return
     */
    @Override
    public R login(UserLoginParam userLoginParam) {
        String userName = userLoginParam.getUserName();
        String password = userLoginParam.getPassword();

        //查询用户信息
        User user = userMapper.login(userName);
        if(user == null) return R.fail("用户不存在");
        //密码加密
        String encode = MD5Util.encode(userLoginParam.getPassword() + MD5Util.USER_SALT);
        if(encode.equals(user.getPassword())){
            //不返回密码属性
            userLoginParam.setPassword(null);
            //设置用户id
            userLoginParam.setUserId(user.getUserId());
            return R.ok("登录成功", userLoginParam);
        }else {
            return R.fail("密码错误");
        }
    }

    @Override
    public PageUtil<User> queryAllUsersByLimit(User user, PageUtil<User> pageUtil) {
        List<User> users = userMapper.queryAllUsersByLimit(user, pageUtil);
        int count = userMapper.count(user);
        pageUtil.setCode("001");
        pageUtil.setList(users);
        pageUtil.setTotalRecords(count);
        return pageUtil;
    }

    @Override
    public R updateUserState(Integer userId, boolean isLock) {
        User user = new User();
        user.setUserId(userId);
        user.setIsLock(isLock);
        int i = userMapper.updateUser(user);
        if(i > 0){
            String msg = "";
            msg = isLock ? "锁定成功": "解锁成功";
            return R.ok(msg);
        }
        return R.fail("操作失败");
    }

    @Override
    public R addUser(User user) {
        if(user == null) return R.fail("数据异常");
        //1. 检查账号是否存在
        int count = userMapper.selectCountByUserName(user.getUserName());
        if(count > 0) return R.fail("账号已存在，不可注册");
        //2. 密码加密，加盐
        //MD5 一种不可逆转的加密方法，只能加密不能解密
        String newPwd = MD5Util.encode(user.getPassword() + MD5Util.USER_SALT);
        user.setPassword(newPwd);
        if(user.getUserType() == null || user.getUserType().getUserTypeId() == null) return R.fail("数据异常");
        //设置添加时间
        user.setCreateTime(new Timestamp(new Date().getTime()));
        //设置用户默认状态
//        user.setUserState(0);
        user.setUserState(UserState.NORMAL.getStateCode());
        int i = userMapper.addUser(user);
        if(i > 0) return R.ok("添加成功");
        return R.fail("添加失败");
    }

    @Override
    public R updateUser(UserUpdateParam userUpdateParam) {
        User user = new User();
        //复制相同属性
        BeanUtils.copyProperties(userUpdateParam, user);
        //设置修改时间
        user.setUpdateTime(new Timestamp(new Date().getTime()));
        int i = userMapper.updateUser(user);
        if(i > 0) return R.ok("修改成功");
        return R.fail("修改失败");
    }

    @Override
    public R deleteUserByUserId(Integer userId) {
        if(userId == null) return R.fail("请求数据异常");
        int i = userMapper.deleteUserByUserId(userId);
        if(i > 0) return R.ok("删除成功");
        return R.fail("删除失败");
    }

    /**
     * 检查账号是否可用业务
     *
     * @param userCheckParam 账号参数 已经校验完毕
     * @return 检查结果
     */
    @Override
    public R check(UserCheckParam userCheckParam) {
        int count = userMapper.selectCountByUserName(userCheckParam.getUserName());
        if(count == 0) return R.ok("账号可以使用");
        return R.fail("账号已存在");
    }

    /**
     * 注册业务
     *  1. 检查账号是否存在
     *  2. 密码加密
     *  3. 插入数据库
     *  4. 返回结果
     * @param userParam 参数已经校验，密码明文
     * @return 注册结果
     */
    @Override
    public R register(UserParam userParam) {
        //1. 检查账号是否存在
        int count = userMapper.selectCountByUserName(userParam.getUserName());
        if(count > 0) return R.fail("账号已存在，不可注册");
        //2. 密码加密，加盐
        //MD5 一种不可逆转的加密方法，只能加密不能解密
        String newPwd = MD5Util.encode(userParam.getPassword() + MD5Util.USER_SALT);

        //创建用户数据
        User user = new User();
        user.setUserName(userParam.getUserName());
        user.setNickname(userParam.getUserName());
        user.setPassword(newPwd);
        //设置添加时间
        user.setCreateTime(new Timestamp(new Date().getTime()));
        //设置用户默认状态
        user.setUserState(UserState.NORMAL.getStateCode());
        //用户类型
        if(user.getUserType() == null) user.setUserType(new UserType());
        user.getUserType().setUserTypeId(2);
        //3. 插入数据库
        int row = userMapper.addUser(user);
        if(row > 0) return R.ok("注册成功");
        return R.fail("注册失败");
    }
}
